package ch01.text03;

import ch01.Student;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Parameter;

/**
 * 反射常用API - Method - 类的方法
 *
 * @author V
 * @date 2025-03-18
 */
public class MainTest02 {
    public static void main(String[] args) throws Exception {
        // 第一：获取操作类的 Class 对象
        Class<Student> clazz = Student.class;

        // 第二：基于 Class 对象，实现相关的操作 - 运行时、动态性 - 框架、工具
        // Class对象可以获取类的所有信息（对象）

        // 1.实例化 Student 对象
        Student stu = clazz.getConstructor()
                .newInstance();

        // 2.获取类中指定名称的方法对象 - 必须指定方法参数类型的 Class 对象
        // getDeclaredMethod(方法名称, Class<?>... 方法参数类型的Class对象)
        // sleep(String address, int hour)
        Method sleepMethod = clazz.getDeclaredMethod("sleep",
                String.class, int.class);


        // 3.开放访问权限
        sleepMethod.setAccessible(true);

        // 4.调用方法 - String msg = stu.sleep("D-230",1) ;
        // invoke(对象, Object... 实参数据)
        Object msg = sleepMethod.invoke(stu, "D-230", 1);


        // 注意：在这里，按需要进行 向下转型 - 把父类对象转换为子类对象
        // if(msg instanceof String) {
        //     String m = (String)msg;
        //     System.out.println(m);
        // }

        // 为什么在这里输出 msg 这个 Object 对象，
        // 可以输入返回的字符串 - 多态！！
        System.out.println(msg.toString());

    }
}
